#include "bsp_ads8320.h"
#define ads_8320_delay		1000//本函数内的简单延时采用FOR循环，控制次数可以整体调节，方便调试


void delay(uint32_t ticks)
{
	unsigned char i;
	while(ticks--)
	{
		for(i=0;i<1;i++);	
	}
}
/***********************************************
函数名称：bsp_ads8320_init
函数参数：
函数意义：初始化
函数返回ֵ：无
*************************************************/
void bsp_ads8320_init(void)
{
	PINSEL_CFG_Type PinCfg;
	PinCfg.Funcnum = PINSEL_FUNC_0;//选择引脚第一功能，其他的功能查看手册
	PinCfg.Portnum = PINSEL_PORT_0;	//选择端口2
	PinCfg.Pinnum = PINSEL_PIN_19;
	PinCfg.Pinnum = PINSEL_PIN_20;
	PinCfg.Pinnum = PINSEL_PIN_21;
	PinCfg.Pinmode = PINSEL_PINMODE_PULLUP;
	PINSEL_ConfigPin(&PinCfg);
	GPIO_SetDir(PINSEL_FUNC_0, (1<<19)|(1<<20)|(1<<21), 1); //设置IO方向输出  
	GPIO_SetValue(PINSEL_PORT_0, (1<<19)|(1<<20)|(1<<21));//设置输出低电平	
	
	PinCfg.Funcnum = PINSEL_FUNC_0;//选择引脚第一功能，其他的功能查看手册
	PinCfg.Portnum = PINSEL_PORT_2;	//选择端口2
	PinCfg.Pinnum = PINSEL_PIN_11;
	PinCfg.Pinmode = PINSEL_PINMODE_PULLUP;
	PINSEL_ConfigPin(&PinCfg);

	GPIO_SetDir(PINSEL_FUNC_2, (1<<11), 0); //设置IO方向输出      
	
}

/***********************************************
函数名称：read_ads8320
函数参数：两片片选，1电压 2电流
函数意义：
函数返回ֵ：无
*************************************************/

uint32_t read_ads8320_v(void)
{
	int i;
	uint32_t read_val=0;
	uint32_t con=0;
	float dat = 0;
	ADS8320_CLK(1);					//空闲时拉高时钟
	GPIO_SetValue(PINSEL_PORT_2, (1<<11));	//拉高输入,等待判定DIN变低
	ADS8320_CS2(0);
	
	while(1)//等待AD转换完成，内部做超时处理，防止死掉
	{
		if(((GPIO_ReadValue(PINSEL_PORT_2)>>11)&(0x01)) == 0)
		{
			ADS8320_CLK(1);			//拉高时钟
			delay(2);		//延时2us
			break;
		}
		ADS8320_CLK(0);				//拉低时钟
		delay(2);
		ADS8320_CLK(1);				//拉高时钟
		delay(2);
		con++;
		if(con>100000)
		{
			return 0;			//后面的读取也没有意义
		}
	}
	//到这里可以准备读数据
	for(i=15;i>=0;i--)
	{
		ADS8320_CLK(0);				//拉低时钟
		delay(2);			//延迟2us
							//上升沿采样
//		read_val <<= 1;
		if((GPIO_ReadValue(PINSEL_PORT_2)>>11)&0x01)
			read_val |= 1<<i;		//如果为高
		
		ADS8320_CLK(1);				//拉高时钟		
		delay(2);			//延时2us
	}

	ADS8320_CS2(1);					//拉低片选进入AD转换，转换完成后DOUT会有低电平

	read_val &= 0xFFFF;
	dat = (float)((((read_val*2.5)/65535)/1.64)*150);
	read_val = (int)(dat*10);
	return (read_val);
}


/***********************************************
函数名称：read_ads8320
函数参数：两片片选，1电压 2电流
函数意义：
函数返回ֵ：无
*************************************************/

uint32_t read_ads8320_i(void)
{
	int i;
	float dat = 0;
	uint32_t read_val=0;
	uint32_t con=0;
	ADS8320_CLK(1);					//空闲时拉高时钟
	GPIO_SetValue(PINSEL_PORT_2, (1<<11));	//拉高输入,等待判定DIN变低
	ADS8320_CS1(0);
	while(1)//等待AD转换完成，内部做超时处理，防止死掉
	{
		if(((GPIO_ReadValue(PINSEL_PORT_2)>>11)&(0x01)) == 0)
		{
			ADS8320_CLK(1);			//拉高时钟
			delay(2);		//延时2us
			break;
		}
		ADS8320_CLK(0);				//拉低时钟
		delay(2);
		ADS8320_CLK(1);				//拉高时钟
		delay(2);
		con++;
		if(con>100000)
		{
			return 0;			//后面的读取也没有意义
		}
	}
	//到这里可以准备读数据
	for(i=15;i>=0;i--)
	{
		ADS8320_CLK(0);				//拉低时钟
		delay(2);			//延迟2us
							//上升沿采样
		if((GPIO_ReadValue(PINSEL_PORT_2)>>11)&0x01)
			read_val |= 1<<i;		//如果为高
		
		ADS8320_CLK(1);				//拉高时钟		
		delay(2);			//延时2us
	}

	ADS8320_CS1(1);					//拉低片选进入AD转换，转换完成后DOUT会有低电平

	read_val &= 0xFFFF;
	dat = (float)((((read_val*2.5)/65535)/1.64));
	read_val = (int)((dat*10000)/200);
	return (read_val);
}
